
#define _CRT_SECURE_NO_WARNINGS
#include "admin.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#pragma once
void getGamesScore(const char* college_code);
void getPlayersScores(char* academyCode);












#pragma once
// 院管理员查询本院分数及排名//未完成
// void getAcademyRankScore(char* academyCode) {    // 调用此函数时已经登录，故不在对“是否存在此学院做检查”
// 	int academyScore = getAcademyScore(academyCode);
// 	int academyRank = getAcademyRank(academyCode);
// 	printf("本学院总得分为：%d 分； ", academyScore);
// 	printf("排名为第%d 名。\n",academyRank);  // 
// }

#define MAX_PROJECTS 10   // 最大比赛数量
#define MAX_STUDENTS_PER_PROJECT 25   // 每个项目最多学生数量



// 项目得分结构体，用于存储每个项目的总得分
typedef struct {
    int project_id; // 项目 ID
    int total_score; // 总得分
} ProjectScore;

void find_students_by_college(const char* college_code, Athlete* athletes, int* count);





// 根据学院代码统计各比赛项目的得分
void getGamesScore(const char* college_code) {
    Athlete students[25];  // 假定一个学院最多25名运动员
    int count = 0;

    // 获取指定学院的学生
    find_students_by_college(college_code, students, &count);

    // 使用一个数组来存储项目得分
    ProjectScore project_scores[MAX_PROJECTS] = { 0 };
    int project_count = 0;

    // 汇总得分
    for (int i = 0; i < count; i++) {
        int current_project_id = students[i].project_id;
        int found = 0;

        // 检查当前项目 ID 是否已经存在于 project_scores 中
        for (int j = 0; j < project_count; j++) {
            if (project_scores[j].project_id == current_project_id) {
                // 如果匹配，累加得分
                project_scores[j].total_score += students[i].score;
                found = 1;
                break;
            }
        }

        // 如果未找到，创建新的项目得分记录
        if (!found && project_count < MAX_PROJECTS) {
            project_scores[project_count].project_id = current_project_id;
            project_scores[project_count].total_score = students[i].score;
            project_count++;
        }
    }

    // 打印每个项目的得分
    printf("\n学院 %s 各比赛项目得分统计：\n", college_code);
    printf("项目\t\t项目ID\t\t总得分\n");
    for (int i = 0; i < project_count; i++) {
        char project_name[20];
        getGameNameByCode(project_scores[i].project_id, project_name);
        printf("%s\t\t%d\t\t%d\n", project_name, project_scores[i].project_id, project_scores[i].total_score);
    }
}

// 获取指定学院的运动员
void find_students_by_college(const char* college_code, Athlete* athletes, int* count) {
    FILE* file = fopen(ATHLETETXT, "r");
    if (!file) {
        perror("无法打开文件");
        return;
    }

    char line[256];
    while (fgets(line, sizeof(line), file)) {
        Athlete student;
        // 解析当前行中的数据
        sscanf(line, "%d %d %d %s", &student.project_id, &student.score, &student.status_code, student.student_id);

        // 检查学院代码是否匹配
        if (strncmp(student.student_id, college_code, 5) == 0) {
            // 如果匹配，则存储到结果数组中
            athletes[*count] = student;
            (*count)++;
        }
    }

    fclose(file);
}
// 查询本学院各运动员得分
void getPlayersScores(char* academyCode) {
    Athlete students[25];  // 假定一个学院最多25名运动员
    int count = 0;

    // 获取指定学院的学生
    find_students_by_college(academyCode, students, &count);
    // 打印每个运动员的得分
    printf("\n学院 %s 各运动员得分统计：\n", academyCode);
    printf("运动员\t\t项目\t\t项目ID\t\t得分\n");
    for (int i = 0; i < count; i++) {
        char project_name[20];
        getGameNameByCode(students[i].project_id, project_name);

        // 使用宽度控制符，例如 %s 和 %d 后加上宽度
        printf("%-12s\t%-10s\t%-8d\t%d\n", students[i].student_id, project_name, students[i].project_id, students[i].score);
    }
}
// 学院审核
void academyReview() {
    FILE* file = fopen(ATHLETETXT, "r");
    if (file == NULL) {
        printf("无法打开文件！\n");
        return;
    }

    // 用于存储记录
    char lines[100][100];
    int lineCount = 0;

    // 读取文件内容
    char line[100];
    while (fgets(line, sizeof(line), file) != NULL) {
        int projectCode, score, statusCode;
        char studentId[20];
        sscanf(line, "%d %d %d %s", &projectCode, &score, &statusCode, studentId);

        // 如果状态码是1，则打印并询问用户是否批准
        if (statusCode == 1) {
            char project_name[20];
            getGameNameByCode(projectCode, project_name);
            printf("比赛代号: %d, 比赛名：%s, 学号: %s ,得分: %d, \n", projectCode, project_name, studentId, score);

            char choice;
            printf("是否批准修改成绩? (y/n): ");
            scanf(" %c", &choice); // 使用空格跳过可能的换行符
            printf("\n");

            // 更新状态码
            if (choice == 'y' || choice == 'Y') {
                statusCode = 2;
            }
            else {
                statusCode = 5;
            }
        }

        // 将记录存储到数组中
        sprintf(lines[lineCount], "%d %d %d %s\n", projectCode, score, statusCode, studentId);
        lineCount++;
    }

    fclose(file); // 关闭读取的文件

    // 将记录写回文件
    file = fopen(ATHLETETXT, "w"); // 以写入模式打开文件
    if (file == NULL) {
        printf("无法打开文件进行写入！\n");
        return;
    }

    for (int i = 0; i < lineCount; i++) {
        fprintf(file, "%s", lines[i]); // 写入更新后的记录
    }

    fclose(file); // 关闭文件
    printf("所有审核请求已受理，暂无更多待审。\n");
}

int isValidAthleteCode(const char* code) {  // 检查学号输入格式，给下面的函数用的
    for (int i = 0; i < strlen(code); i++) {
        if (!isalnum(code[i])) {
            return 0; // 无效
        }
    }
    return 1; // 有效
}
// 学院申诉
void academyComplaint(char* academyCode) {
    int sportCode;
    while (1) {
        printf("\n你要对哪个比赛项目进行申诉？请输入对应比赛编号\n查看所有比赛项目请输入0\n退出请输入-1\n>>>");
        if (scanf("%d", &sportCode) != 1) { // 输入验证
            while (getchar() != '\n'); // 清空输入缓冲区
            printf("\n请输入有效的数字\n");
            continue;
        }

        if (sportCode == -1) { // 退出到上级菜单
            break;
        }

        if (sportCode == 0) {
            getPlayersScores(academyCode);
            continue;
        }

        if (isGameExist(sportCode)) {  // 检查比赛是否存在  //检测是否在公示期内，如果不在公示期内，则不能申诉
            switch (isMoreThanOneHour(sportCode))
            {
            case 0:
                printf("请问你要申请修改哪位运动员的成绩？请输入其学号：");
                char athleteCode[20];

                if (scanf("%19s", athleteCode) != 1) { // 限制输入长度为19个字符
                    fprintf(stderr, "输入错误，请重试。\n");
                    continue; // 处理输入错误的情况
                }

                if (!isValidAthleteCode(athleteCode)) {
                    fprintf(stderr, "学号格式不正确，请输入有效的学号。\n");
                    continue; // 处理格式不正确的情况
                }

                int statusCode = getStatusCode(athleteCode, sportCode);
                switch (statusCode) {
                case 0:
                    updateStatusCode(athleteCode, sportCode, 2);
                    printf("\n申诉成功！请等待管理员审核\n\n");
                    break;
                case 1:
                    updateStatusCode(athleteCode, sportCode, 2);  // 运动员申诉，学院也申诉
                    break;
                case 2:
                case 3:
                case 4:
                    printf("\n申诉已提交总管理员处理，请耐心等待\n\n");
                    break;
                case 5:
                    printf("\n申诉已被驳回，不可修改\n\n");
                    break;
                case 6:
                    printf("\n成绩已经更改\n\n");
                    break;
                default:
                    printf("不存在此学号，请检查输入\n\n");   // 如果学号格式正确但不是要申请修改的，会落到这里
                    break;
                }

                break;
            case -1:
                printf("\n请等待总管理员确认成绩，当前时间不可申诉\n");
                break;
            case 1:
                printf("\n已超出公示期，不可申诉！\n");
                break;
            case -2:
                printf("\n未找到相关记录，请联系管理员\n");
                break;
            case -3:
                printf("\n未找到相关文件，请联系管理员\n");
                break;
            default:
                printf("未知错误，请联系管理员\n");
                break;
            }

        }
        else {
            printf("该比赛不存在，请重新输入！\n");
        }
    }
}
